﻿using DimensionsHelper.Common.Contracts.Excel;

namespace DimensionsHelper.ExcelAddIn.Core;

public interface IExcelAddIn
{

    /// <summary>
    /// 获取当前AddIn的设置对象。
    /// </summary>
    IExcelAddInSettings GetSetting();

    /// <summary>
    /// 判断指定名称的设置对象是否是默认设置对象。
    /// </summary>
    /// <param name="name">配置名</param>
    bool IsDefaultSetting(string name);

    /// <summary>
    /// 获取本地设置对象的名称列表。
    /// </summary>
    string[] GetLocalSettingNames();

    /// <summary>
    /// 重新反序列化指定的对象。如果类型不匹配，将返回 <see langword="null"/>。
    /// </summary>
    /// <param name="data">待匹配的数据</param>
    object? DeserializeTransmission(object data);

    /// <summary>
    /// 获取指定名称的本地设置对象，如果不存在，将返回 <see langword="null"/>。
    /// </summary>
    /// <param name="name">指定设置名</param>
    IExcelAddInSettings? GetLocalSetting(string name);

    /// <summary>
    /// 获取默认的配置对象。
    /// </summary>
    /// <returns></returns>
    IExcelAddInSettings GetDefaultSetting();

    /// <summary>
    /// 更新设置对象，如果类型不匹配，将返回false。
    /// </summary>
    /// <param name="settings">指定的设置对象</param>
    bool UpdateSetting(IExcelAddInSettings settings);

    /// <summary>
    /// 保存当前AddIn的设置对象作为默认设置到本地。
    /// </summary>
    /// <param name="settings">指定的设置对象</param>
    bool Save(object settings);

    /// <summary>
    /// 将指定名称的设置对象保存到本地，如果asDefault为true，则同时保存为默认设置。
    /// 如果设置对象不匹配，将返回false。
    /// </summary>
    /// <param name="settingName">设置名</param>
    /// <param name="settings">设置对象</param>
    /// <param name="asDefault">是否保存为默认设置</param>
    bool Save(string settingName, object settings, bool asDefault);

    /// <summary>
    /// 将当前AddIn的设置对象保存到本地，如果asDefault为true，则同时保存为默认设置。
    /// </summary>
    /// <param name="settingName">设置名</param>
    /// <param name="asDefault">是否保存为默认设置</param>
    void Save(string settingName, bool asDefault);

    /// <summary>
    /// 运行当前AddIn的操作。
    /// </summary>
    /// <param name="workbook">当前的工作簿</param>
    void Run(IExcelWorkbookOperator workbook);

    /// <summary>
    /// 创建设置工作表
    /// </summary>
    /// <param name="workbook">当前工作簿</param>
    void BuildSettingSheet(IExcelWorkbookOperator workbook);
}
